package com.cobra.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.net.URI;
import java.util.Arrays;

public class HdfsClient {
    private   FileSystem fileSystem;
    @Before
    public void init() throws Exception{
        //初始化一个hdfs参数对象
        Configuration configuration = new Configuration();
        //第一个地址
        //第二个配置对象
        //第三个user信息
         fileSystem = FileSystem.get(new URI("hdfs://hadoop102:8020"),configuration,"liwei");
    }
    @Test
    public void testMkdirs() throws Exception{
    //创建多个文件夹
    fileSystem.mkdirs(new Path("/xiyou/sunwukong"));
    //关闭资源
    fileSystem.close();
    }
    @Test
    //测试上传文件
    public void testPut() throws Exception{
        //1 表示原数据是否删除
        //2 表示是否覆盖
        //3 原路径地址
        //4 目标路径地址
        fileSystem.copyFromLocalFile(false,true,new Path("src/main/resources/log4j.properties"),new Path("/xiyou/sunwukong/log4j1.properties"));
    }
    //测试文件下载
    @Test
    public void testGet() throws Exception{
        //参数说明
        // 1. hdfs的文件是否删除
        //2. 源文件 hdfs路径
        //3. 目标地址路径
        fileSystem.copyToLocalFile(false,new Path("/xiyou/sunwukong/log4j1.properties"),new Path("src/main/resources/"),true);
    }
    //测试删除数据
    @Test
    public void testDelete() throws Exception{
        fileSystem.delete(new Path("/xiyou/sunwukong/log4j1.properties"),false);
    }
    //文件更名和移动
    @Test
    public void testMove() throws Exception{
    fileSystem.rename(new Path("/xiyou/sunwukong/log4j1.properties"),new Path("/xiyou/sunwukong/haha.properties"));
    //文件移动和修改
        fileSystem.rename(new Path("/xiyou/sunwukong/haha.properties"),new Path("/123.properties"));
        //更换目录的名字
        fileSystem.rename(new Path("/xiyou"),new Path("/xinXiYou"));
    }
    //获取文件详细信息
    @Test
    public void testListFile() throws Exception{
        RemoteIterator<LocatedFileStatus> locatedFileStatusRemoteIterator = fileSystem.listFiles(new Path("/"), true);
        while (locatedFileStatusRemoteIterator.hasNext()){
            LocatedFileStatus locatedFileStatus = locatedFileStatusRemoteIterator.next();
            System.out.println("文件路径: "+locatedFileStatus.getPath());
            System.out.println("文件权限: "+locatedFileStatus.getPermission());
            System.out.println("文件分组: "+locatedFileStatus.getGroup());
            System.out.println("文件大小: "+locatedFileStatus.getLen());
            System.out.println("文件修改时间: "+locatedFileStatus.getModificationTime());
            System.out.println("文件副本: "+locatedFileStatus.getReplication());
            System.out.println("文件块大小: "+locatedFileStatus.getBlockSize());
            System.out.println("文件名: "+locatedFileStatus.getPath().getName());
            BlockLocation[] blockLocations = locatedFileStatus.getBlockLocations();
            System.out.println(Arrays.toString(blockLocations));
            System.out.println("========================================================================================");
        }
    }

    //判断是文件还是文件夹
    @Test
    public void testFile() throws Exception{
        FileStatus[] fileStatuses = fileSystem.listStatus(new Path("/"));
        for(FileStatus fileStatus : fileStatuses){
            if(fileStatus.isFile()){
                System.out.println("文件: "+fileStatus.getPath().getName());
            }else {
                System.out.println("目录: "+fileStatus.getPath().getName());
            }
        }
    }








    @After
    public void close() throws Exception{
        fileSystem.close();
    }
}
